/*****************************************************************************
*                     Organizaci�n de Datos - 75.06                          *
*                         C�tedra Lic. Servetto                              *
*            Facultad de Ingenier�a - Universidad de Buenos Aires            *
******************************************************************************/ 

#include "../Comun/Archivo.h"
#include "../Comun/ConversorDeStreams.h"
#include "../Comun/Operacion.h"
#include "ConexionCapaIndices.h"
#include "AdministradorDeArchivos.h"

#include <sstream>
#include <iostream>
#include <string>

using namespace std;
using namespace Comun;

namespace CapaFisica
{

	void ConexionCapaIndices::EjecutarLlamada(stringstream* entrada, stringstream* salida)
	{
		Comun::Grupo* grupo;

		Operacion operacion = ConversorDeStreams::StreamAOperacion(entrada);

		switch(operacion)
		{
			case ExisteClase:
				ConversorDeStreams::BooleanoAStream(AdministradorDeArchivos::Instancia().ExisteClase(ConversorDeStreams::StreamACadena(entrada)), salida);
				return;

			case CrearArchivoRF:
				AdministradorDeArchivos::Instancia().CrearClaseParaRF(ConversorDeStreams::StreamAMetadatosDeArchivo(entrada));
				ConversorDeStreams::VoidAStream(salida);
				return;

			case CrearArchivoRLV:
				AdministradorDeArchivos::Instancia().CrearClaseParaRLV(ConversorDeStreams::StreamAMetadatosDeArchivo(entrada));
				ConversorDeStreams::VoidAStream(salida);
				return;

			case CrearGrupo:
				ConversorDeStreams::EnteroAStream(AdministradorDeArchivos::Instancia().CrearGrupo(ConversorDeStreams::StreamACadena(entrada), ConversorDeStreams::StreamADatosDeGrupo(entrada)), salida);
				return;

			case GuardarGrupo:
				grupo = &ConversorDeStreams::StreamADatosDeGrupo(entrada);
				ConversorDeStreams::EnteroAStream(AdministradorDeArchivos::Instancia().GuardarGrupo(ConversorDeStreams::StreamABooleano(entrada),ConversorDeStreams::StreamACadena(entrada),*grupo), salida);
				for(IteradorDeRegistros i = grupo->Registros.begin(); i != grupo->Registros.end(); ++i)
					ConversorDeStreams::EnteroAStream((*i).Tamanio, salida);
				return;

			case LeerGrupo:
				ConversorDeStreams::DatosDeGrupoAStream(AdministradorDeArchivos::Instancia().LeerGrupo(ConversorDeStreams::StreamACadena(entrada), ConversorDeStreams::StreamAEntero(entrada)), salida);
				return;

			case BorrarGrupo:
				AdministradorDeArchivos::Instancia().BorrarGrupo(ConversorDeStreams::StreamACadena(entrada), ConversorDeStreams::StreamAEntero(entrada));
				ConversorDeStreams::VoidAStream(salida);
				return;

			case PrimerGrupo:
				ConversorDeStreams::EnteroAStream(AdministradorDeArchivos::Instancia().PrimerGrupo(ConversorDeStreams::StreamACadena(entrada)), salida);
				return;

			case SiguienteGrupo:
				ConversorDeStreams::EnteroAStream(AdministradorDeArchivos::Instancia().SiguienteGrupo(ConversorDeStreams::StreamACadena(entrada), ConversorDeStreams::StreamAEntero(entrada)), salida);
				return;

			default:
				cerr << "CapaFisica->ConexionCapaIndices.cpp->ConexionCapaIndices::EjecutarLlamada(stringstream* entrada, stringstream* salida)" << endl << "Operacion no reconocida por la capa fisica" << endl;
				throw new exception();
		}
	};

}
